package es.wtestgen.action.profesor;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.sql.Date;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionRedirect;

import com.lowagie.text.Document;

import es.wtestgen.action.WTestGenAction;
import es.wtestgen.bean.profesor.ExamenForm;
import es.wtestgen.bean.profesor.PreguntaForm;
import es.wtestgen.domain.Asignatura;
import es.wtestgen.domain.Examen;
import es.wtestgen.domain.Pregunta;
import es.wtestgen.domain.Profesor;
import es.wtestgen.domain.Respuesta;
import es.wtestgen.services.AsignaturaDAO;
import es.wtestgen.services.ExamenDAO;
import es.wtestgen.services.PreguntaDAO;
import es.wtestgen.services.RespuestaDAO;
import es.wtestgen.util.EstrategiaGeneraExamen;
import es.wtestgen.util.EstrategiaGeneraExamenByPaso0;
import es.wtestgen.util.EstrategiaGeneraExamenByPaso1;
import es.wtestgen.util.EstrategiaGeneraExamenByPaso2;
import es.wtestgen.util.EstrategiaGeneraExamenByPaso3;
import es.wtestgen.util.GeneradorPdf;
import es.wtestgen.util.Utiles;

public class MantenimientoExamenesAction extends WTestGenAction {

	private static final Log log = LogFactory.getLog(MantenimientoExamenesAction.class);

	@Override
	public ActionForward _execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)  {

		log.info("_________Estamos en MantenimientoExamenesAction, donde se gestionan todos los tramites de los examenes");
		
		String accion = request.getParameter("accion");
		ActionForward forward = null;
		
		if(accion == null || accion.equals("")){
			forward = listar(mapping, form, request, response);
		}else if(accion.equals("nuevo")){
			forward = nuevo(mapping, form, request, response);
		}else if(accion.equals("eliminar")){
			forward = eliminar(mapping, form, request, response);
		}else if(accion.equals("editar")){
			forward = editar(mapping, form, request, response);
		}else if(accion.equals("guardar")){
			forward = guardar(mapping, form, request, response);
		}else if(accion.equals("guardarExamenManual")){
			forward = guardarExamenManual(mapping, form, request, response);
		}else if(accion.equals("cargarRespuestas")){
			forward = cargarRespuestas(mapping, form, request, response);
		}else if(accion.equals("paso1")){
			forward = paso1(mapping, form, request, response);			
		}else if(accion.equals("paso2")){
			forward = paso2(mapping, form, request, response);
		}else if(accion.equals("paso3")){
			forward = paso3(mapping, form, request, response);		
		}else if(accion.equals("generarExamenAutomatico")){
			forward = generarExamenAutomatico(mapping, form, request, response);			
		}else if(accion.equals("guardarEdicionExamen")){
			forward = guardarEdicionExamen(mapping, form, request, response);
		}else if(accion.equals("eliminarRespuestaExamen")){
			forward = eliminarRespuestaExamen(mapping, form, request, response);			
		}else if(accion.equals("publicar")){
			forward = publicar(mapping, form, request, response);
		}else if(accion.equals("ver")){
			forward = ver(mapping, form, request, response);		
		}else if(accion.equals("pdf")){
			forward = pdf(mapping, form, request, response);			
		}else if(accion.equals("buscar")){
			forward = buscar(mapping,form,request,response);
		}else if(accion.equals("buscarExamen")){
			forward = buscarExamen(mapping,form,request,response);
		}

		return forward;
	}
	
	
	private ActionForward buscarExamen(ActionMapping mapping,
			ActionForm form, HttpServletRequest request,
			HttpServletResponse response) {

		ExamenForm examenForm = (ExamenForm)form;
		
		ExamenDAO examenDao = new ExamenDAO();
		
		List<Examen> examenes = examenDao.findByParameters(examenForm);
		
		if(examenes != null && examenes.size()>0){
			examenForm.setExamenes(examenes);
		}else{
			examenForm.setExamenes(new ArrayList<Examen>());
		}
		request.setAttribute("examenes", examenForm.getExamenes());
				
		return mapping.findForward("buscarExamen");		
	}


	private ActionForward buscar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
		
		/*
		 * Para recuperar las asignaturas del profesor en la jsp para rellenar el select
		 */
		Profesor profesor = (Profesor)request.getSession().getAttribute("usuario");
		
		ExamenForm examenForm = (ExamenForm) form;
		
		examenForm.reset();
		
		AsignaturaDAO asignaturaDao = new AsignaturaDAO();
		
		List<Asignatura>asignaturas = new ArrayList<Asignatura>();
		asignaturas = asignaturaDao.findAsignaturasProfesor(profesor);
		
		request.getSession().setAttribute("asignaturas", asignaturas);
		
		return mapping.findForward("buscarExamen");
	}
	
	
	
	private ActionForward pdf(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
		
		ExamenForm examenForm = (ExamenForm)form;
		
		String codExam = (String)request.getParameter("codExam");
		String resuelto = (String)request.getParameter("resuelto");
		
		ExamenDAO examenDao = new ExamenDAO();
		
		Examen examen = new Examen();
				
		List<Pregunta> preguntasExamen = new ArrayList<Pregunta>();
		List<Respuesta> respuestasExamen = new ArrayList<Respuesta>();
		
		Document document = new Document();
		
		examen = (Examen)examenDao.findById(codExam).get(0);
		
		preguntasExamen = examenDao.getPreguntas(examen);
		respuestasExamen = examenDao.getRespuestas(examen);
		
		examen.setPreguntas(new HashSet<Pregunta>(preguntasExamen));
		examen.setRespuestas(new HashSet<Respuesta>(respuestasExamen));
		
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		try{
			
			if(resuelto != null && resuelto.equals("si")){
				GeneradorPdf.generarExamenResueltoPdf(request,response, examen,document, baos);				
			}else{
				GeneradorPdf.generarExamenPdf(request,response, examen,document, baos);			
			}
			
			response.setContentType ("application/pdf");
			//set the header and also the Name by which user will be prompted to save
			response.setHeader ("Content-Disposition", "attachment;filename=\"Examen-"+examen.getAsignatura().getNombreAsig()+"("+examen.getFechaExam()+").pdf\"");
			
			ServletOutputStream out = response.getOutputStream();
			baos.writeTo(out);
			out.flush();
		}catch (IOException e) {
			log.info("_____Error: no se ha podido generar el documento en Pdf",e);
			e.printStackTrace();
		}
		
		return null;
	}


	private ActionForward ver(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
		
		String codExam = (String)request.getParameter("codExam");
		
		ExamenDAO examenDao = new ExamenDAO();
		AsignaturaDAO asignaturaDao = new AsignaturaDAO();
		
		Examen examen = new Examen();
		Asignatura asignatura = new Asignatura();
		
		List<Respuesta> respuestasExamen = new ArrayList<Respuesta>();
		List<Pregunta> preguntasExamen = new ArrayList<Pregunta>();
		
		examen = (Examen)examenDao.findById(codExam).get(0);
		
		preguntasExamen = examenDao.getPreguntas(examen);
		respuestasExamen = examenDao.getRespuestas(examen);
		
		examen.setPreguntas(new HashSet<Pregunta>(preguntasExamen));
		examen.setRespuestas(new HashSet<Respuesta>(respuestasExamen));
		
		asignatura = (Asignatura)asignaturaDao.findById(String.valueOf(examen.getAsignatura().getCodAsig())).get(0);
		
		request.getSession().setAttribute("asignatura", asignatura);	
		
		request.getSession().setAttribute("examen", examen);
		
		Set<Pregunta> preguntas = new HashSet<Pregunta>();
		Set<Respuesta> respuestas = new HashSet<Respuesta>();
				
		for (Iterator iterator = examen.getPreguntas().iterator(); iterator.hasNext();) {
			Pregunta p = (Pregunta) iterator.next();
			p.setEnunciadoPreg(Utiles.quitarHTML(p.getEnunciadoPreg()));			
			preguntas.add(p);
		}
		
		for (Iterator iterator = examen.getRespuestas().iterator(); iterator.hasNext();) {
			Respuesta r = (Respuesta) iterator.next();
			r.setRespuestaResp(Utiles.quitarHTML(r.getRespuestaResp()));
			respuestas.add(r);			
		}
		
		request.getSession().setAttribute("preguntasExamen", examen.getPreguntas());
		//request.getSession().setAttribute("preguntasExamen", preguntas);
		request.getSession().setAttribute("respuestasPreguntaExamen", examen.getRespuestas());	
		//request.getSession().setAttribute("respuestasPreguntaExamen", respuestas);	
		
		return mapping.findForward("verExamen");
	}


	private ActionForward publicar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
		
		ExamenForm examenForm = (ExamenForm)form;
		
		String codExam = (String)request.getParameter("codExam");
		
		ExamenDAO examenDao = new ExamenDAO();
		
		Examen examen = new Examen();
		
		examen = (Examen)examenDao.findById(codExam).get(0);
		
		examen.setPublicado(true);
		
		examenDao.guardarExamen(examen);
		
		ActionRedirect actionRedirect = null;
		ActionForward findForward = mapping.findForward("publicadoExamen");
		actionRedirect = new ActionRedirect(findForward);
		actionRedirect.addParameter("accion", "");
		actionRedirect.addParameter("publicadoOk", "si");
		return actionRedirect;
		
		//return listar(mapping, form, request, response);
	}


	private ActionForward eliminarRespuestaExamen(ActionMapping mapping,
			ActionForm form, HttpServletRequest request,
			HttpServletResponse response) {

		ExamenForm examenForm = (ExamenForm)form;
		
		String codResp = (String)request.getParameter("codResp");
		String codExam = (String)request.getParameter("codExam");
		
		Examen examen = new Examen();
		Respuesta respuesta = new Respuesta();
		
		ExamenDAO examenDao = new ExamenDAO();
		RespuestaDAO respuestaDao = new RespuestaDAO();
		
		examen = (Examen)examenDao.findById(codExam).get(0);
		
		respuesta = (Respuesta)respuestaDao.findById(codResp).get(0);
		
		examen.getRespuestas().remove(respuesta);
		
		ActionRedirect actionRedirect = null;
		ActionForward findForward = mapping.findForward("guardadoExamen");
		actionRedirect = new ActionRedirect(findForward);
		actionRedirect.addParameter("accion", "editar");
		actionRedirect.addParameter("codExam", codExam);
		return actionRedirect;
	}


	private ActionForward guardarEdicionExamen(ActionMapping mapping,
			ActionForm form, HttpServletRequest request,
			HttpServletResponse response) {

		ExamenForm examenForm = (ExamenForm)form;
		
		ExamenDAO examenDao = new ExamenDAO();
		
		Examen examen = new Examen();
		
		examen = (Examen)examenDao.findById(String.valueOf(examenForm.getCodExam())).get(0);
		
		ActionRedirect actionRedirect = null;
		if(examenDao.guardarExamenAutomaticoEnAsignatura(examen)){			
			ActionForward findForward = mapping.findForward("guardadoExamen");
			actionRedirect = new ActionRedirect(findForward);
			actionRedirect.addParameter("accion", "");
			return actionRedirect;			
		}else{
			return mapping.findForward("error");
		}		
	}


	private ActionForward generarExamenAutomatico(ActionMapping mapping,
			ActionForm form, HttpServletRequest request,
			HttpServletResponse response) {
		
			ExamenForm examenForm = (ExamenForm)form;
			
			Asignatura asignatura = new Asignatura();
			
			EstrategiaGeneraExamen estrategia = null;
			
			AsignaturaDAO asignaturaDao = new AsignaturaDAO();
			
			/*
			 *	Con este parametro se nos indica desde donde se ha pulsado el boton finalizar para generar el examen 
			 */
			
			String paso = (String)request.getParameter("paso");
			
			if(paso == null || "".equals(paso)){
				paso = "0";
			}
			
			
			if("0".equals(paso)){
				estrategia = new EstrategiaGeneraExamenByPaso0();
			}else if("1".equals(paso)){
				estrategia = new EstrategiaGeneraExamenByPaso1();				
			}else if("2".equals(paso)){
				estrategia = new EstrategiaGeneraExamenByPaso2();	
			}else{
				estrategia = new EstrategiaGeneraExamenByPaso3();				
			}		
			examenForm = estrategia.generaExamen(examenForm);
			
		asignatura = (Asignatura)asignaturaDao.findById(String.valueOf(examenForm.getCodAsig())).get(0);	
		
		
		Set<Pregunta> preguntas = new HashSet<Pregunta>();
		Set<Respuesta> respuestas = new HashSet<Respuesta>();
				
		for (Iterator iterator = examenForm.getPreguntas().iterator(); iterator.hasNext();) {
			Pregunta p = (Pregunta) iterator.next();
			p.setEnunciadoPreg(Utiles.quitarHTML(p.getEnunciadoPreg()));			
			preguntas.add(p);
		}
		
		for (Iterator iterator = examenForm.getRespuestas().iterator(); iterator.hasNext();) {
			Respuesta r = (Respuesta) iterator.next();
			r.setRespuestaResp(Utiles.quitarHTML(r.getRespuestaResp()));
			respuestas.add(r);			
		}
		
		
		
		request.getSession().setAttribute("asignatura", asignatura);	
			
		request.getSession().setAttribute("examen", examenForm);	
		
		
		/*
		request.getSession().setAttribute("preguntasExamen", examenForm.getPreguntas());
		request.getSession().setAttribute("respuestasPreguntaExamen", examenForm.getRespuestas());	
		 */
		
		preguntas = new HashSet<Pregunta>(examenForm.getPreguntas());
		respuestas = new HashSet<Respuesta>(examenForm.getRespuestas());
		
		request.getSession().setAttribute("preguntasExamen", preguntas);
		request.getSession().setAttribute("respuestasPreguntaExamen", respuestas);
		
		return mapping.findForward("resumenExamen");

	}


	private ActionForward paso3(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
		
		ExamenForm examenForm = (ExamenForm)form;
		
		List<Asignatura> asignaturas = (List)request.getSession().getAttribute("asignaturas");
		
		request.getSession().setAttribute("asignaturas", asignaturas);
		
		request.getSession().setAttribute("examen", examenForm);
		
		return mapping.findForward("paso3");
	}

	private ActionForward paso4(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
		
		ExamenForm examenForm = (ExamenForm)form;
		
		List<Asignatura> asignaturas = (List)request.getSession().getAttribute("asignaturas");
		
		request.getSession().setAttribute("asignaturas", asignaturas);
		
		request.getSession().setAttribute("examen", examenForm);
		
		return mapping.findForward("paso4");
	}
	

	private ActionForward paso2(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
				
		ExamenForm examenForm = (ExamenForm)form;
		
		List<Asignatura> asignaturas = (List)request.getSession().getAttribute("asignaturas");
		
		request.getSession().setAttribute("asignaturas", asignaturas);
		
		request.getSession().setAttribute("examen", examenForm);
		
		return mapping.findForward("paso2");
	}


	private ActionForward paso1(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
		
		ExamenForm examenForm = (ExamenForm)form;
		
		Asignatura asignatura = new Asignatura();
		
		AsignaturaDAO asignaturaDao = new AsignaturaDAO();		
		
		List<Asignatura> asignaturas = new ArrayList<Asignatura>();
		
		String codAsig = String.valueOf(examenForm.getCodAsig());
		
		if(codAsig == null || "".equals(codAsig) || "0".equals(codAsig)){
			 codAsig = (String)request.getParameter("codAsig"); 
		}
		asignatura = (Asignatura)asignaturaDao.findById(codAsig).get(0);	
		
		request.getSession().setAttribute("asignatura", asignatura);
		request.getSession().setAttribute("examen", examenForm);	
		
		return mapping.findForward("paso1");
	}


	private ActionForward cargarRespuestas(ActionMapping mapping,
			ActionForm form, HttpServletRequest request,
			HttpServletResponse response) {
		
		ExamenForm examenForm = (ExamenForm) form;
		
		Pregunta pregunta = new Pregunta();
		
		PreguntaDAO preguntaDao = new PreguntaDAO();
		RespuestaDAO respuestaDao = new RespuestaDAO();
		
		List<Pregunta> preguntasSeleccionada = preguntaDao.findById(String.valueOf(examenForm.getCodPreg()));
		
		pregunta = preguntasSeleccionada.get(0);
		
		List<Respuesta> respuestasPregunta = respuestaDao.findRespuestasPregunta(pregunta);
		
		List<Respuesta> respuestas = (List)request.getSession().getAttribute("respuestas");
		
		request.getSession().setAttribute("respuestas", respuestasPregunta);
		request.getSession().setAttribute("examen", examenForm);
		
		return mapping.findForward("examenManual");
	}


	private ActionForward guardarExamenManual(ActionMapping mapping,
			ActionForm form, HttpServletRequest request,
			HttpServletResponse response) {
		
		ExamenForm examenForm = (ExamenForm)form;
		
		ActionRedirect actionRedirect = null;
		
		ExamenDAO examenDao = new ExamenDAO();
		PreguntaDAO preguntaDao = new PreguntaDAO();
		
		List<Respuesta> respuestas = examenForm.getRespuestas();
		
		int numeroPreguntas = Integer.parseInt(request.getSession().getAttribute("numeroPreguntas").toString());
		
		ActionForward findForward = null; 
		
		if(examenDao.guardarRespuestasDePreguntaDeExamen(Integer.parseInt(examenForm.getCodExam()),examenForm.getCodPreg(),examenForm.getRespuestasPregunta())){
			numeroPreguntas--;
			if(numeroPreguntas > 0){
				/*
				 * quedan preguntas por insertar en el examen
				 *
				 * eliminamos de nuestras posibles preguntas la que acabamos de insertar
				 */
				List<Pregunta> preguntas = (List)request.getSession().getAttribute("preguntas");
				Pregunta pregunta = new Pregunta();
				pregunta = (Pregunta)preguntaDao.findById(String.valueOf(examenForm.getCodPreg())).get(0);
				preguntas.remove(pregunta);
				
				/*
				 * volvemos a meter las preguntas en sesión pero con un objeto menos
				 */
				request.getSession().setAttribute("preguntas", preguntas);
				request.getSession().setAttribute("respuestas", new ArrayList<Respuesta>());
				request.getSession().setAttribute("numeroPreguntas", numeroPreguntas);
				
				findForward = mapping.findForward("examenManual");
				actionRedirect = new ActionRedirect(findForward);
				
			}else{
				/*
				 * ya se han insertado todas las preguntas necesarias
				 */
				findForward = mapping.findForward("examenManualGuardado");
				actionRedirect = new ActionRedirect(findForward);				
			}
		}else{
			findForward = mapping.findForward("errorPreguntaRespuestasEnExamen");
			actionRedirect = new ActionRedirect(findForward);
		}
		
		/*
		 * queda una pregunta menos por insertar
		 */
		
		request.getSession().setAttribute("numeroPreguntas", numeroPreguntas);
		
		return actionRedirect;
	}


	public ActionForward nuevo(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			 {
		
		/*
		 * Para recuperar las asignaturas del profesor en la jsp para rellenar el select
		 */
		Profesor profesor = (Profesor)request.getSession().getAttribute("usuario");

		// Limpiamos el formulario
		ExamenForm examenForm = (ExamenForm) form;
		examenForm.reset();
		
		List<Asignatura>asignaturas = new ArrayList<Asignatura>();
		
		AsignaturaDAO asignaturaDao = new AsignaturaDAO();
		PreguntaDAO preguntaDao = new PreguntaDAO();
		ExamenDAO examenDao = new ExamenDAO();
		
		asignaturas = asignaturaDao.findAsignaturasProfesor(profesor);
		
		/*
		 * Para poder generar un examen de una asignatura, esta debe tener al menos en el sistema
		 * 10 preguntas almacenadas ya que es el numero minimo de preguntas para un examen
		 */
		for (Iterator iterator = asignaturas.iterator(); iterator.hasNext();) {
			Asignatura asignatura = (Asignatura) iterator.next();
			List<Pregunta> preguntas = preguntaDao.findPreguntasAsignatura(asignatura);
			if(preguntas.size() < 10){
				iterator.remove();
			}
		}
		
		List<Examen> examenes =  examenDao.findAll();
		if(examenes != null && examenes.size()>0){
			examenForm.setExamenes(examenes);
		}else{
			examenForm.setExamenes(new ArrayList<Examen>());
		}
		
		request.getSession().setAttribute("asignaturas", asignaturas);
		request.getSession().setAttribute("examen", examenForm);
		return mapping.findForward("nuevoExamen");
	}

	public ActionForward eliminar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
	{
		ExamenForm examenForm = (ExamenForm) form;
		
		ExamenDAO examenDao = new ExamenDAO();
		
		String codExam = request.getParameter("codExam");
		
		/*
		 * Con esta clase que hereda de ActionForward le podemos anadir parametros a las
		 * redirecciones forward 
		 */
		ActionRedirect actionRedirect = null;
		
		if(examenDao.eliminar(Integer.parseInt(codExam))){
			ActionForward findForward = mapping.findForward("eliminadoExamen");
			actionRedirect = new ActionRedirect(findForward);
			actionRedirect.addParameter("accion", "");
			actionRedirect.addParameter("eliminadoOk", "si");
			return actionRedirect;			
		}else{
			return mapping.findForward("error");
		}
	}
	
	public ActionForward editar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
	{			
		Profesor profesor = (Profesor)request.getSession().getAttribute("usuario");
		
		ExamenForm examenForm = (ExamenForm) form;
		
		ExamenDAO examenDao = new ExamenDAO();
		AsignaturaDAO asignaturaDao = new AsignaturaDAO();
		
		String codExam = request.getParameter("codExam");
		
		Examen examen = new Examen();
		
		List<Examen> examenes = new ArrayList<Examen>();
		List<Asignatura>asignaturas = new ArrayList<Asignatura>();
		
		examenes = examenDao.findById(codExam);
		
		examen = examenes.get(0);
		
		asignaturas = asignaturaDao.findAsignaturasProfesor(profesor);
		
		/*
		 * Para poder generar un examen de una asignatura, esta debe tener al menos en el sistema
		 * 10 preguntas almacenadas ya que es el numero minimo de preguntas para un examen
		 */
		for (Iterator iterator = asignaturas.iterator(); iterator.hasNext();) {
			Asignatura asignatura = (Asignatura) iterator.next();
			PreguntaDAO preguntaDao = new PreguntaDAO();
			List<Pregunta> preguntas = preguntaDao.findPreguntasAsignatura(asignatura);
			if(preguntas.size() < 10){
				iterator.remove();
			}
		}
				
		Asignatura asignatura = (Asignatura)asignaturaDao.findById(String.valueOf(examen.getAsignatura().getCodAsig())).get(0);	
		
		
		examenForm.setCodExam(codExam);
		examenForm.setCodAsig(examen.getAsignatura().getCodAsig());
		examenForm.setDificultadExamen(examen.getDificultadExamen());
		examenForm.setFechaExam(examen.getFechaExam());
		examenForm.setNumPreg(examen.getNumPreg());
		examenForm.setNumResp(examen.getNumResp());
		
		examenForm.setPreguntas(new ArrayList<Pregunta>(examen.getPreguntas()));
		examenForm.setRespuestas(new ArrayList<Respuesta>(examen.getRespuestas()));
		
		
		if(examen.getAsignatura().getCodAsig() <= 0){
			examenForm.setCodAsig(Integer.parseInt((String)request.getAttribute("codAsig")));			
		}else{
			examenForm.setCodAsig(examen.getAsignatura().getCodAsig());			
		}
		
		
		request.getSession().setAttribute("asignaturas", asignaturas);
		request.getSession().setAttribute("asignatura", asignatura);
		request.setAttribute("examen", examenForm);
		return mapping.findForward("editarExamen");
	}
	

	private ActionForward guardar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
	{
		ExamenForm examenForm = (ExamenForm) form;
		
		ExamenDAO examenDao = new ExamenDAO();		
		
		Examen examen = new Examen();
		
		//List<Pregunta> preguntasExamen = (List)request.getSession().getAttribute("preguntasExamen");
		Set<Pregunta> preguntasExamen = (Set)request.getSession().getAttribute("preguntasExamen");
		
		//List<Respuesta> respuestasPreguntaExamen = (List)request.getSession().getAttribute("respuestasPreguntaExamen");
		Set<Respuesta> respuestasPreguntaExamen = (Set)request.getSession().getAttribute("respuestasPreguntaExamen");
				
		Set<Respuesta> respuestas = new HashSet<Respuesta>();
		
		Asignatura asignatura = (Asignatura)request.getSession().getAttribute("asignatura");
		
		Date date = null;
		
		if(examenForm.getFechaExam() == null || "".equals(examenForm.getFechaExam())){
			GregorianCalendar calendar = new GregorianCalendar();
			long milisegundos = calendar.getTimeInMillis();
			date = new Date(milisegundos);
			int anyo = date.getYear()+1900;
			int mes = date.getMonth()+1;
			int dia = date.getDate();
			String d = "";
			String m = "";
			if(dia > 0 && dia < 10){
				d = "0" + String.valueOf(dia);
			}else{
				d = String.valueOf(dia);
			}
			if(mes > 0 && mes < 10){
				m = "0" + String.valueOf(mes);				
			}else{
				m = String.valueOf(mes);
			}
			String f = d + "/" + m + "/" + String.valueOf(anyo);
			examenForm.setFechaExam(f);
		}
		
		examen.setFechaExam(examenForm.getFechaExam());			
		examen.setNumPreg(examenForm.getNumPreg());
		examen.setNumResp(examenForm.getNumResp());
		examen.setPublicado(false);
		examen.setAsignatura(asignatura);
		examen.setDificultadExamen(examenForm.getDificultadExamen());
		examen.setPreguntas(new HashSet<Pregunta>(preguntasExamen));
		
		examen.setRespuestas(new HashSet<Respuesta>(respuestasPreguntaExamen));
		
		ActionRedirect actionRedirect = null;
		if(examenDao.guardarExamenAutomaticoEnAsignatura(examen)){			
			ActionForward findForward = mapping.findForward("guardadoExamen");
			actionRedirect = new ActionRedirect(findForward);
			actionRedirect.addParameter("accion", "");
			actionRedirect.addParameter("guardadoOk", "si");
			return actionRedirect;			
		}else{
			return mapping.findForward("error");
		}
		
	}
	
	
	private ActionForward generarExamenManual(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
	{
		/*
		 *	Falta hacer la logica para cargarse los datos necesarios para la pagina 
		 *	de edicion del examen manualmente
		 */
		
		ExamenForm examenForm = (ExamenForm)form;
		
		PreguntaDAO preguntaDao = new PreguntaDAO();
		ExamenDAO examenDao = new ExamenDAO();
		AsignaturaDAO asignaturaDAO = new AsignaturaDAO();

		Asignatura asignatura = new Asignatura();
		Examen examen = new Examen();
		
		int numPreg = examenForm.getNumPreg();
		int numeroPreguntas = numPreg;
		int numResp = examenForm.getNumResp();
		int codAsig = examenForm.getCodAsig();
		
		List<Asignatura> asignaturas = asignaturaDAO.findById(String.valueOf(codAsig));
		
		asignatura = asignaturas.get(0);
		examen.setAsignatura(asignatura);
		
		if(examenForm.getFechaExam() == null || "".equals(examenForm.getFechaExam())){
			GregorianCalendar calendar = new GregorianCalendar();
			long milisegundos = calendar.getTimeInMillis();
			Date date = new Date(milisegundos);
			int anyo = date.getYear()+1900;
			int mes = date.getMonth();
			int dia = date.getDate();
			String f = String.valueOf(dia) + "/" + String.valueOf(mes) + "/" + String.valueOf(anyo);
			examenForm.setFechaExam(f);
		}
		
		examen.setFechaExam(examenForm.getFechaExam());
		examen.setNumPreg(numPreg);
		examen.setNumResp(numResp);
		
		if(examenForm.getCodExam() != null && !examenForm.getCodExam().equals("") && !examenForm.getCodExam().equals("0")){
			int id = Integer.parseInt(examenForm.getCodExam());
			examen.setCodExam(id);
		}else{
			examen.setCodExam(-1);
		}
		
		if(examenDao.guardarExamen(examen)){
			List<Pregunta> preguntas = preguntaDao.findPreguntasAsignatura(asignatura);
			List<Respuesta> respuestas = new ArrayList<Respuesta>();
			examenForm.setCodExam(String.valueOf(examen.getCodExam()));
			request.getSession().setAttribute("examen", examenForm);
			request.getSession().setAttribute("preguntas", preguntas);
			request.getSession().setAttribute("respuestas", respuestas);
			request.getSession().setAttribute("numeroPreguntas", numeroPreguntas);
			
			return mapping.findForward("examenManual");			
		}else{
			return mapping.findForward("error");			
		}
		
	}


	public ActionForward listar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response){
		
		ExamenForm examenForm = (ExamenForm)form;
		
		ExamenDAO examenDao = new ExamenDAO();
				
		List<Examen>listaExamenes = examenDao.findAll();
		
		if(listaExamenes!= null && listaExamenes.size()>0){
			examenForm.setExamenes(listaExamenes);
		}else{
			examenForm.setExamenes(new ArrayList<Examen>());
		}
		request.setAttribute("examenes", examenForm.getExamenes());		
		return mapping.findForward("listarExamenes");
	}
	
}
